#ifndef SQL_H
#define SQL_H

#include <QObject>
#include <QSqlDatabase>
#include <QVector>

struct UserInfo
{
    QString username;
    QString password;
    QString auth;
};

struct EbookInfo
{
    int numId;
    QString bookname;         //书名
    QString booktype;         //文件类型
    QString author;           //作者
    QString publisher;        //出版社
    QString publishyear;      //出版年份
    QString bookpath;         //书所在路径
    QString bookdir;          //书所在目录
    QString bookisbn;         //书籍ISBN号
    QString booklabel;        //书标签
    QString bookintroduction; //简介
};

class Sql : public QObject
{
    Q_OBJECT
public:
    explicit Sql(QObject *parent = nullptr);

    //单例
    static Sql *ptrSql;
    static Sql *getInstance()
    {
        if (nullptr == ptrSql)
        {
            ptrSql = new Sql;
        }
        return ptrSql;
    }

    //三个表：ebook保存完整信息 "序号" "书名" "类型" "标签类型" "目录" "路径" "作者" "出版社" "出版年份" "ISBN号" "简介"
    //       ebookdir只保存目录
    //       ebooktype只保存文件类型

    //初始化数据库
    void init();

    //添加书籍信息到数据库ebook
    bool addBookinfo(QList<EbookInfo> bookInfoList);

    //添加数据路径到ebookdir
    bool addBookDir2db(QVector<QString> dirSet);

    //删除数据库ebookdir中对应的路径
    bool delBookDir(QString delDir);

    //清空数据库ebookdir
    bool clearBookDir();

    //获取数据库中保存的所有电子书路径
    QVector<QString> getBookDir();

    //添加选中的文件类型到数据库
    bool addBooktype2db(QStringList booktypeList);

    //清空文件类型表
    bool clearBooktype();

    //获取ebooktype数据表中的所有文件类型
    QStringList getBooktype();

    //获取ebook数据库中的所有数据
    QList<EbookInfo> getBookinfo();

    //根据提供的类型获取ebook数据库中的数据
    QList<EbookInfo> getBookinfoBasisToType(QString type, QString searchItem);

    //获取书籍总数
    quint32 getAllBookNum();

    //根据类型查询书籍数量
    quint32 getBookCount(QString type, QString item);

    //获取所有booktype书籍类型，如只有pdf,txt,azw3
    QStringList getBookTypeList();

    //获取所有bookdir数据路径，如有两个路径E:/learning、E:/C
    QStringList getBookDirList();

    //获取书籍标签
    QStringList getBookLabelList();

    //获取书简介
    QString getBookIntroduction(QString bookpath);

    //根据类型更新书籍信息
    bool updateBookInfoBasisToType(QString type, QString item, QString bookpath);

    //更新书籍信息
    bool updateBookInfo(EbookInfo bookinfo);

    //清空书籍信息表ebook
    bool clearEbook();

    //清理已经不存在于本地的文件的记录
    bool clearNotExistBook(QStringList notExistPathList);

    //清除ebook数据表中对应路径下的数据
    bool clearBookInfoBasisToBookdir(QString bookdir);

    //清除文件类型不在booktype中的对应的ebook中的数据
    bool clearBookInfoBasisToBooktype(QString booktype);

private:
    QSqlDatabase m_db;

};

#endif // SQL_H
